/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"
#include "曲线模型.h"

#include <节点/插座/list/list数值插座.h>
#include <节点/插座/list/list矢量插座.h>
#include <节点/插座/list/list物体插座.h>

#include "Context/数据创建销毁.h"

#include "网格类JIT函数.h"


C_曲线网格节点::C_曲线网格节点(S_设备环境& ctx) : C_节点基类(DEF_曲线网格节点, E_节点类型::e_节点Type_网格) {
	m_Ctx = ctx;
	f_setWName(u"曲线");
	
	C_插座基类* socket;
	DEF_创建Vec3_1D插座_I(u"端点");
	DEF_创建Vec3_1D插座_I(u"控制点A");
	DEF_创建Vec3_1D插座_I(u"控制点B");

	DEF_创建物体插座_O(u"曲线");


	m_Ob = f_node_构建曲线物体数据(m_Ctx);
	f_node_物体添加到全局容器(m_Ob);
	f_node_物体添加到主场景(m_Ob);
}

C_曲线网格节点::~C_曲线网格节点() {
	
}

bool C_曲线网格节点::f_update() {
	auto* 端点 = DEF_Vec3插座_1D数据(f_get输入插座(1));
	auto* 控制点A = DEF_Vec3插座_1D数据(f_get输入插座(2));
	auto* 控制点B = DEF_Vec3插座_1D数据(f_get输入插座(3));

	
	auto 点 = (S_Curve3D*)f_core_array_new_type(0, E_值类型::e_Type_Curve3D);
	auto 索引 = (S_UI32Array*)f_core_array_new_type(0, E_值类型::e_Type_UI32);

	f_JIT_构建曲线点(点, 索引, 端点, 控制点A, 控制点B);

	auto* me = f_ob_getMesh(m_Ob, 0);
	f_mesh_fill顶点数据(me, 点);
	f_mesh_fill索引数据(me, 索引);

	f_core_array_free((S_Array*)点);
	f_core_array_free((S_Array*)索引);

	f_buf_网格元素变换属性_at(f_ob_getMesh(m_Ob, 0)->m_网格元素变换属性).m_Color = f_PackData4X8({ 10,10,10,255 });
	f_buf_网格元素变换属性_at(f_ob_getMesh(m_Ob, 1)->m_网格元素变换属性).m_Color = f_PackData4X8({ 120,120,1,255 });
	f_buf_网格元素变换属性_at(f_ob_getMesh(m_Ob, 2)->m_网格元素变换属性).m_Color = f_PackData4X8({220,80,50,255});

	*me->m_Bound = f_surface_计算曲线包围盒(me);
	return false;
}

std::string	C_曲线网格节点::DEF_节点编译函数{
	m_ReleaseCode = "";
	m_Code = "";
	std::string name = f_getName();

	if (m_区域父节点) {
		m_区域父节点->m_Code += m_Code;
		return "";
	}
	return m_Code;
}

S_物体* C_曲线网格节点::f_虚拟体() {
	return m_Ob;
}

void C_曲线网格节点::f_删除() {
	f_node_物体从主场景中移除(m_Ob);
	f_node_从全局容器移除物体(m_Ob);
}

void C_曲线网格节点::f_回收() {
	f_node_物体添加到全局容器(m_Ob);
	f_node_物体添加到主场景(m_Ob);
}

void C_曲线网格节点::f_读取(FILE* f) {
	C_节点基类::f_读取(f);

	S_文件块 文件块 = f_file_读取文件块(f);
	if (文件块.m_块类型 == E_节点工程文件块类型::e_工程文件块_节点实例属性) {
		const uint8* 下一次读取数据指针 = 文件块.m_data;

		if (f_file_版本对比(文件块, S_引擎配置::g_低版本号_8, S_引擎配置::g_文件版本号)) {
			//下一次读取数据指针 = f_ob_Load物体(m_Ob, 下一次读取数据指针);
		}
	}
	free(文件块.m_data);
}

void C_曲线网格节点::f_写入(FILE* f) {
	C_节点基类::f_写入(f);
	auto 文件块 = f_文件块_创建(E_节点工程文件块类型::e_工程文件块_节点实例属性, S_引擎配置::g_文件版本号);

	S_UI8Array* 块 = (S_UI8Array*)f_core_array_new(0, sizeof(uint8));
	//f_ob_Save物体(m_Ob, 块);

	f_file_保存文件块(f, 文件块, 块);
}

C_节点基类* f_node_创建曲线网格节点(S_设备环境& ctx, C_节点树* 子节点树) {
	return new C_曲线网格节点(ctx);
}
C_节点基类* f_node_载入曲线网格节点(S_设备环境& ctx, FILE* f) {
	C_曲线网格节点* node = new C_曲线网格节点(ctx);
	return node;
}
void		f_node_保存曲线网格节点(C_节点基类* n, FILE* f) {
	C_曲线网格节点* node = dynamic_cast<C_曲线网格节点*>(n);
}








C_曲面网格节点::C_曲面网格节点(S_设备环境& ctx) : C_节点基类(DEF_曲线网格节点, E_节点类型::e_节点Type_网格) {
	m_Ctx = ctx;
	f_setWName(u"曲面");
	m_Ob = nullptr;

	C_插座基类* socket;
	DEF_创建Vec3插座_v1_I(u"端点");
	DEF_创建Vec3插座_v1_I(u"控制点A");
	DEF_创建Vec3插座_v1_I(u"控制点B");

	DEF_创建物体插座_O(u"网格");

}

C_曲面网格节点::~C_曲面网格节点() {

}

bool C_曲面网格节点::f_update() {

	return false;
}

std::string	C_曲面网格节点::DEF_节点编译函数{
	m_ReleaseCode = "";
	m_Code = "";
	std::string name = f_getName();

	if (m_区域父节点) {
		m_区域父节点->m_Code += m_Code;
		return "";
	}
	return m_Code;
}

S_物体* C_曲面网格节点::f_虚拟体() {

	return nullptr;
}

void C_曲面网格节点::f_删除() {

}

void C_曲面网格节点::f_回收() {

}

void C_曲面网格节点::f_读取(FILE* f) {
	C_节点基类::f_读取(f);

	S_文件块 文件块 = f_file_读取文件块(f);
	if (文件块.m_块类型 == E_节点工程文件块类型::e_工程文件块_节点实例属性) {
		const uint8* 下一次读取数据指针 = 文件块.m_data;
	}
}

void C_曲面网格节点::f_写入(FILE* f) {
	C_节点基类::f_写入(f);
	auto 文件块 = f_文件块_创建(E_节点工程文件块类型::e_工程文件块_节点实例属性, S_引擎配置::g_文件版本号);

	S_UI8Array* 块 = (S_UI8Array*)f_core_array_new(0, sizeof(uint8));

	f_file_保存文件块(f, 文件块, 块);
}

C_节点基类* f_node_创建曲面网格节点(S_设备环境& ctx, C_节点树* 子节点树) {
	return new C_曲面网格节点(ctx);
}
C_节点基类* f_node_载入曲面网格节点(S_设备环境& ctx, FILE* f) {
	C_曲面网格节点* node = new C_曲面网格节点(ctx);
	return node;
}
void		f_node_保存曲面网格节点(C_节点基类* n, FILE* f) {
	C_曲面网格节点* node = dynamic_cast<C_曲面网格节点*>(n);
}

